package com.cskaoyan.javase.oop2._1extends._11final._2method;

import javafx.animation.Animation;

/**
 * final修饰(成员)方法,表示最后的方法，最终的方法，表示该方法无法被重写
 * （但是仍然可以被继承）。
 *
 * 语法:
 * [访问权限修饰符] final 返回值类型 方法名(形参列表){
 *      // 方法体
 * }
 *
 * 说明：
 *
 * final修饰成员方法，表示该方法无法被重写，但是仍然是可以继承的。
 * 什么样的成员方法应该设置为final呢？
 *
 * 方法的设计已经比较完善，不需要子类进行修改了，子类只需要乖乖继承，使用父类的实现即可。
 * 比如一旦修改就会导致问题、bug等时，就可以设置为final修饰。
 * 即便是父类的方法不是很完善，但只要是希望子类不要改写方法都可以这么做。（要么你就用，不爽你就自己实现一个）
 * 日常开发，程序员还是比较少见有需要把方法设置成final修饰的。
 * 同样比较多见于JDK源码中，比较常见的有：像Object类中的getClass()方法还有其中和线程相关的方法。
 *
 * 扩展:
 *      1.final在修饰方法时,能够修饰以下特殊方法吗?
 *          a.私有方法
 *              可以,但是多余,不要加
 *          b.构造方法
 *              语法不允许加final修饰
 *          c.静态方法
 *              可以,但是多余,不要加
 *
 *
 *      2.总结: 哪些方法不能被重写?
 *          a.私有方法,所有的子类没有权限的父类方法,子类都不能重写
 *              可以继承
 *          b.静态方法
 *          c.构造方法
 *          d.final修饰的成员方法
 *              可以继承
 *
 * @since 09:56
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        Cat c = new Cat();
        c.test();
    }
}
class Person{
    public final void eat(){
        System.out.println("吃正常的事物~~");
    }
    // 'private' method declared 'final' 多此一举
    private final void test(){

    }

    public final static void testStatic(){}

    // public final Person() {
    // }
}
class LaoBa extends Person{
    // @Override
    // public void eat() {
    //     System.out.println("干啦,xdm~~");
    // }
}
class Animal {
    public final void test() {
        System.out.println("6666666666");
    }
}

class Cat extends Animal {
    // 'test()' cannot override 'test()' in 'com.cskaoyan.javase.oop2._1extends._11final._2method.Animal'; overridden method is final
    // @Override
    // public void test() {
    //     System.out.println("hello world!");
    // }
}